var express = require('express');
var router = express.Router();
var sql = require('./../sql');
var User = require('./../sql/col/users');
var md5 = require('md5'); // 密码加密
var uuid = require('node-uuid'); // 生成用户id
var jwt = require('jsonwebtoken');// token模块
var Pro = require('./../sql/col/pros');
var { validateToken } = require('./../utils')

router.get('/', function(req, res, next) {
  res.send('用户相关接口');
})

/**
 * @api {post} api/users/register 注册功能
 * @apiDescription 注册功能
 * @apiGroup users
 * @apiParam { string } tel 手机号
 * @apiParam { string } password 密码
 * @apiSuccessExample { json } Success-Response:
 * {
 *  code: '10400',
 *  message: '请完善表单信息'
 * }
 * {
 *  code: '10666',
 *  message: '注册成功'
 * }
* {
 *  code: '10606',
 *  message: '该用户已注册'
 * }
 * @apiSampleRequest /api/users/register
 * @apiVersion 1.0.0
 */
router.post('/register', (req, res, next) => {
  // 1.获取用户提交的 手机号 和 密码 --- （去除首位空格）
  let { tel, password } = req.body
  console.log(123,tel,password)
  tel = tel.trim()
  password = password.trim()
  // 2.判断手机号个密码是否为空
  if (!tel || !password) { // 如果用户没有输入手机号和密码提示并且不再继续往下执行
    console.log(111)
    res.send({
      code: '10400',
      message: '请完善表单信息'
    })
    return
  }
  // 3.依据手机号查询数据库，有没有该用户
  sql.find(User, { tel }, { _id: 0 }).then(data => {
    if (data.length === 0) { // 3.1 没有查到，可以完成注册
      // 4.注册
      password = md5(password)
      const obj = {
        userid: 'user_' + uuid.v1(),
        tel,
        password,
        nickname: '请设置昵称',
        sex: -1, // 还未设置性别
        avatar: '',
        email: '',
        member: 0
      }
      sql.insert(User, obj).then(() => {
        res.send({
          code: '10666',
          message: '注册成功'
        })
      })
    } else { // 3.2 查询到该用户，提示已注册，请登录
      res.send({
        code: '10606',
        message: '该用户已注册'
      })
    }
  })
})

/**
 * @api {post} api/users/login 登陆功能
 * @apiDescription 登陆功能
 * @apiGroup users
 * @apiParam { string } tel 手机号
 * @apiParam { string } password 密码
 * @apiSuccessExample { json } Success-Response:
 * {
 *  code: '10400',
 *  message: '请完善表单信息'
 * }
 * {
 *  code: '10888',
 *  message: '登陆成功'
 * }
* {
 *  code: '10808',
 *  message: '该用户未注册'
 * }
 * @apiSampleRequest /api/users/login
 * @apiVersion 1.0.0
 */
router.post('/login',(req,res,next)=>{
  let { tel, password } = req.body
  tel = tel.trim()
  password = password.trim()
  if(!tel || !password){
    res.send({
      code:'10400',
      message:'请完善表单信息'
    })
    return
  }
  sql.find(User,{tel},{_id:0}).then(data=>{
    if(data.length > 0){
      password = md5(password);
      sql.find(User,{tel,password},{_id:0}).then(result=>{
        if(result.length === 0){
          res.send({
            code:'10505',
            message:'密码错误'
          })
        }else{
          // 验证成功后，服务端会签发一个 Token，把这个 Token 发送给客户端。
          // 生成token
          let token = jwt.sign({tel,password},'qfyp',{
            expiresIn:10*24*60*60//一天有效期
          })
          res.send({
            code:'10888',
            message:'登录成功',
            data:{
              userid:data[0].userid,
              nickname:data[0].nickname,
              token
            }
          })         
        }
      })
    }else{// 查无此用户，表示还没有注册
      res.send({
        code:'10808',
        message:'该用户未注册'
      })
    }
  })
})

/**
 * @api {get} api/users/getuserinfo 获取用户信息
 * @apiDescription 获取用户信息
 * @apiGroup users
 * @apiParam { string } userid 用户id
 * @apiParam { string } token 验证登陆令牌
 * @apiSuccessExample { json } Success-Response:
 * res.send({
      code: '200',
      message: '获取用户信息',
      data
    })
 * res.send({
    code: '10119',
    message: 'token验证失败'
  })
 * @apiSampleRequest /api/users/getuserinfo
 * @apiVersion 1.0.0
 */
router.get('/getuserinfo',(req, res, next) => {
  // 获取用户id 以及 token -- 验证token
  validateToken(req).then(() => {
    let { userid } = req.query
    sql.find(User, { userid }, { _id: 0 }).then((data) => {
      res.send({
        code: '200',
        message: '获取用户信息',
        data: data[0]
      })
    })
  }).catch(() => {
    res.send({
      code: '10119',
      message: 'token验证失败'
    })
  })
})

/**
 * @api {post} api/users/updateinfo 更改用户信息
 * @apiDescription 更改用户信息
 * @apiGroup users
 * @apiParam { string } userid 用户id
 * @apiParam { string } token 验证登陆令牌
 * @apiParam { string } nickname 昵称
 * @apiParam { string } email 邮箱
 * @apiParam { string } sex 性别
 * @apiSuccessExample { json } Success-Response:
 * res.send({
      code: '200',
      message: '修改用户信息成功',
      data
    })
 * res.send({
    code: '10119',
    message: 'token验证失败'
  })
 * @apiSampleRequest /api/users/updateinfo
 * @apiVersion 1.0.0
 */
router.post('/updateinfo',(req, res, next) => {
  // 获取用户id 以及 token -- 验证token
  validateToken(req).then(() => {
    let { userid,nickname, email, sex } = req.body
    nickname = nickname || ''
    email = email || ''
    sex *= 1
    sql.update(User, { userid }, { $set: { nickname, email, sex }}).then(()=>{
      res.send({
        code: '200',
        message: '修改用户信息成功'
      })
    })
  }).catch(() => {
    res.send({
      code: '10119',
      message: 'token验证失败'
    })
  })
})

/**
 * @api {post} api/users/updateAvatar 更新头像
 * @apiDescription 更新头像
 * @apiGroup users
 * @apiParam { string } userid 用户id
 * @apiParam { string } token 验证登陆令牌
 * @apiParam { string } avatar 昵称
 * @apiSuccessExample { json } Success-Response:
 * res.send({
      code: '200',
      message: '更新头像',
      data
    })
 * res.send({
    code: '10119',
    message: 'token验证失败'
  })
 * @apiSampleRequest /api/users/updateAvatar
 * @apiVersion 1.0.0
 */
router.post('/updateAvatar', (req, res, next) => {
  validateToken(req).then(() => {
    let { userid, avatar } = req.body
    sql.update(User, { userid }, { $set: { avatar } }).then(() => {
      res.send({
        code: '200',
        message: '更新头像'
      })
    })
  }).catch(() => {
    res.send({
      code: '10119',
      message: 'token验证失败'
    })
  })
})

/**
 * @api {get} api/users/getCollection 获取收藏的产品
 * @apiDescription 获取收藏的产品
 * @apiGroup users
 * @apiParam { string } collectionData 收藏的产品id的数组字符串
 * @apiParam { token } token 登陆验证
 * @apiSuccessExample { json } Success-Response:
 * res.send({
        code: '200',
        message: '获取收藏的产品',
        data: result
      })
 * res.send({
    code: '10119',
    message: 'token验证失败'
  })
 * @apiSampleRequest /api/users/getCollection
 * @apiVersion 1.0.0
 */
router.get('/getCollection', (req, res, next) => {
  validateToken(req).then(() => {
    // 后端传递参数 是 字符串，前端需要对象转字符串
    let { collectionData } = req.query
    // 字符串转数组
    collectionData = JSON.parse(collectionData)
    let arr = [] // 用来存放异步操作的数组
    // 遍历数组，每一次的异步操作 都赋值给一个promise
    collectionData.map(item => {
      // sql.find 异步操作 支持promise，返回promise
      let p = sql.find(Pro, { proid: item })
      arr.push(p)
    })
    console.log('arr', arr)
    // 利用 Promise.all 解决多个异步操作的问题
    // Promise.all 的参数是一个数组
    // all 内的每一个promise都执行完毕才会执行 then
    Promise.all(arr).then((result) => {
      // result [[{}], [{}], [{}]]
      let data = []
      result.map(item => {
        data.push(item[0])
      })
      res.send({
        code: '200',
        message: '获取收藏的产品',
        data: data
      })
    })
  }).catch(() => {
    res.send({
      code: '10119',
      message: 'token验证失败'
    })
  })
})

module.exports = router;
